package cn.lcsjsxy.yxc.miscellaneous;

/*面向对象的特征之一：封装和隐藏
* 1.程序设计追求：
* 高内聚：类的内部数据操作细节自己完成，不允许外部干涉
* 低耦合：仅对外暴露少量的方法用于使用
* 2.隐藏对象内部的复杂性，只对外公开简单的接口。便于外界调用，从而提高系统的可扩展性、可维护性。
* 通俗的说，把该隐藏的隐藏起来，该暴露的暴露出来。这就是封装性的设计思想。
*
* 一、问题的引入：
* 当我们创建一个类的对象以后，我们可以通过”对象.属性“的方法，对对象的属性进行赋值。这里，赋值操作要受到属性的数据类型
* 和存储范围的制约。除此之外，没有其他制约条件。但是，在实际问题中，我们往往需要给属性赋值加入额外的限制条件。这个条件
* 就不能在属性声明时体现，我们只能通过方法进行限制条件的添加
* 同时，我们需要避免用户再使用”对象.属性“的方式进行赋值。则需要将属性声明为私有的（private）
* --》此时，针对于属性就体现了封装性
*
* 二、封装性的体现：
* 我们将类的属性XXX私有化（private),同时，提供公共的（public）方法来获取（getXXX）和设置（setXXX）此属性的值
*
*   拓展：封装性的体现：1.如上 2.不对外暴露的私有的方法 3.单例模式  ...
*
* 三、封装性的体现：需要权限修饰符来配合
* 1.Java规定的4中权限：（从小到大排列），private、缺省、protected、public
* 2.具体的：4种权限可以用来修饰类及类的内部结构：属性、方法、构造器、com.yang_xc.objectoriented.内部类
*    修饰类的话，只能使用：缺省、public
*
* 总结封装性：Java提供了4种权限修饰符来修饰类及类的内部结构在被调用时的可见性的大小*/
public class Encapsulation {
    public static void main(String[] args) {
        Animal A1=new Animal();
        // A1.legs=4;
        // A1.name="马牛逼";
        // A1.age=114514;
        A1.setLegs(4);

        A1.setAge(16);
        A1.setName("诸葛村妇");
        System.out.println(A1.getLegs());
        System.out.println(A1.getName());
        System.out.println(A1.getAge());
        A1.show();

    }
}

class Animal{
    public String name;
    private int age;
    private int legs;  //腿的数量

//属性的设置
    public void setLegs(int i) {
        if (i >= 0 || i % 2 == 0)
            legs = i;
        else
            legs = 0;
    }

    public void setName(String i){
        if (i.length()>=4&&i.length()<=8)
            name=i;
        else
            name="错误信息";
    }

    public void setAge(int i){
        if(i>=0&&i<=120)
            age=i;
        else
            age=-1;
    }
//属性的获取
    public int getLegs(){
        return legs;
    }

    public String getName(){
        return name;
    }

    public int getAge(){
        return age;
    }

    public void eat(){
        System.out.println("我要吃...饭！！！！");
    }

    public void show(){
        System.out.println("name="+name+"\tage="+age+"\tlegs="+legs);
    }
}
